package com.design.future.jdk;

import java.util.concurrent.*;

/**
 * FutureTask�����������FutureData��,
 * Callable������RealData�ķ�װ����ʵ��������Ҫʵ��Callable�ӿڣ�
 * Fucure������ִ��״̬��
 */
public class UseFuture implements Callable<String> {
    private String para;
    public UseFuture(String para){
        this.para = para;
    }
    //��������ʵ��ҵ���߼�����ִ�п��ܺ���
    @Override
    public String call()  throws Exception{
        //ģ��ִ�к�ʱ
        Thread.sleep(5000);
        String result = this.para + "��ʵ���ݼ���";
        return result;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        String queryStr = "query";
        //����FutureTask�����Ҵ�����Ҫ��������ҵ���߼��������,����һ����ʵ����Callable�ӿڵ���
        FutureTask<String> future = new FutureTask<String>(new UseFuture(queryStr));

        //����һ���̶��̵߳��̳߳����߳���Ϊ1,
        ExecutorService executor = Executors.newFixedThreadPool(2);
        //�����ύ����future,�����߳�ִ��RealData��call()����ִ��
        //submit��execute������ ��һ����submit���Դ���ʵ��Callable�ӿڵ�ʵ������ �ڶ�����submit�����з���ֵ
        Future<?> f1 = executor.submit(future);		//��������һ���߳�ȥִ�е�

        while(true){
            if(f1.get()==null){
                System.out.println("callable�Ѿ�ִ������");
                break;
            }
        }

        try {
            //�����������������ݲ�����Ҳ����������ִ������ҵ���߼�
            System.out.println("����ʵ�ʵ�ҵ���߼�...");
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //���û�ȡ���ݷ���,���Callable()����û��ִ�����,����Ȼ����еȴ�
        System.out.println("futureģʽ��õ����ݣ�" + future.get());

        executor.shutdown();
    }
}
